/**
 * 
 */
package stc.skymobi.netty.handler.codec.access.protocol;

import stc.skymobi.bean.esb.annotation.EsbField;
import stc.skymobi.bean.esb.core.EsbHeaderable;

/**
 * <pre>
 //0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
 //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //|           srcmodule(2)        |            dstmodule(2)       |
 //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //|             length(2)         |            flags(2)       	   |
 //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //           seqNum(0..2)         |            ack(0..2)          |
 //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 //|            msgCode(2)         |            result(2)          |
 //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 * </pre>
 */
public class AccessFixedHeader implements EsbHeaderable {

    /** 正宗access固定头长度 */
	public static final int FIXED_HEADER_SIZE = 8;
    /** 不含序列号的access包头长度 */
    public static final int WITHOUT_SEQ_NUM_HEADER_SIZE = 10;
	
    @EsbField(index = 1,bytes = 2)
	private int srcESBAddr;

    @EsbField(index = 2,bytes = 2)
	private int dstESBAddr;

    @EsbField(index = 3)
	private short length;

    @EsbField(index = 7, bytes = 2)
    private int msgCode;

    /**
     * 16bit
     * 1        发送端模块号(回复者有义务将SrcID填为回复消息的DstID)
     * 2        网络端(接入)是否带上COOKIE信息进行消息传递
     * 3-4      终端联网模式  00: cmnet; 01: cmwap直连;  10: cmwap代理; 11: reserve;
     * 5        网络端接入是否带上Profile信息进行消息传递
     * 6        网络端(接入)是否带上New UA信息进行消息传递
     * 7-8      Reserved
     * 9-10     告诉网络端(接入)消息类型，普通消息、消息添加了序列号、打包消息、压缩(加密): 00:普通消息;01:消息添加了序列号; 10:打包消息(未实现)
     * 11       加密消息
     * 0x0	    普通消息 <br/>
     0x0100     添加了序列号的消息 <br/>
     0x0120		添加了序列号的带上New UA信息进行传递的消息
     0x0420		普通加密消息
     0x0520		加密加了序列号的消息
     */
    @EsbField(index = 4)
	private short flags = 0x0120;

    public void setSrcESBAddr(int srcESBAddr) {
        this.srcESBAddr = srcESBAddr;
    }


    public void setDstESBAddr(int dstESBAddr) {
        this.dstESBAddr = dstESBAddr;
    }

    public short getLength() {
        return length;
    }

    public void setLength(short length) {
        this.length = length;
    }

    @Override
    public boolean checkIntegrity() {
        return true;
    }

    public void setFlags(short flags) {
        this.flags = flags;
    }

    public int getMsgCode() {
        return msgCode;
    }

    public void setMsgCode(int msgCode) {
        this.msgCode = msgCode;
    }

    @Override
    public int getSrcESBAddr() {
        return srcESBAddr;
    }

    @Override
    public int getDstESBAddr() {
        return dstESBAddr;
    }

    @Override
    public int getSeqNum() {
        return 0;
    }

    @Override
    public short getResult() {
        return 0;
    }

    @Override
    public int getFlags() {
        return flags;
    }

    @Override
    public String toString() {
        return "AccessFixedHeader{" +
                "srcESBAddr=0x" + Integer.toHexString(srcESBAddr).toUpperCase() +
                ", dstESBAddr=0x" + Integer.toHexString(dstESBAddr).toUpperCase() +
                ", length=" + length +
                ", flags=" + flags +
                ", msgCode=0x" + Integer.toHexString(msgCode).toUpperCase() +
                '}';
    }
}
